from urllib import request  # 导入 urllib 库，用于发送 HTTP 请求
from fake_useragent import UserAgent  # 导入 fake_useragent 库，用于生成随机的 User-Agent
from lxml import etree  # 导入 lxml 库的 etree 模块，用于解析 HTML/XML
import os  # 导入 os 模块，用于文件和目录操作

# 创建一个 UserAgent 对象，用于生成随机的浏览器 User-Agent
ua = UserAgent()

# 设置 HTTP 请求头，'User-Agent' 是用来伪装为浏览器访问
headers = {'User-Agent': ua.random}

# 目标 URL 是一个随机美文页面
url = 'https://www.dushu.com/meiwen/random/'

# 构造一个 HTTP 请求对象，将目标 URL 和请求头加入到请求中
req = request.Request(url=url, headers=headers)

# 发送 HTTP 请求并获取服务器的响应
response = request.urlopen(req)

# 将服务器响应的 HTML 数据读取出来，并将其解码为 UTF-8 格式
html = response.read().decode('utf-8')

# 使用 lxml.etree 的 HTML 方法解析 HTML 数据，生成 DOM 树对象
tree = etree.HTML(html)

# 使用 XPath 定位 HTML 中的标题部分，提取 `<h1>` 标签中的文本
# 这里提取的是标题，返回的是一个列表
title = tree.xpath('//div[@class="article-detail"]/h1/text()')

# 使用 XPath 定位 HTML 中的作者部分，提取 `<span>` 标签中的文本
# 这里提取的是作者信息，返回的是一个列表
author = tree.xpath('//div[@class="article-info"]/span/text()')

# 使用 XPath 定位 HTML 中的正文部分，提取 `<p>` 标签中的文本
# 这里提取的是文章正文，每段内容作为列表中的一项
content = tree.xpath('//div[@class="text"]/p/text()')

# 定义一个保存美文的目录名称
dir = 'meiwen'

# 检查是否存在该目录，如果不存在则创建
if not os.path.exists(dir):
    os.mkdir(dir)

# 打开一个文件准备写入数据，文件名使用文章标题，编码为 UTF-8
with open(dir + '/' + title[0] + '.txt', 'w', encoding='utf-8') as f:
    # 写入标题，列表中的第一个元素是文章标题
    f.write('标题：' + title[0] + '\n\n')

    # 写入作者信息，列表中的第一个元素是作者名
    f.write('作者：' + author[0] + '\n\n')

    # 遍历正文内容，将每段文字写入文件
    for text in content:
        f.write(text + '\n')
